package com.beantools.filters;

import com.beantools.execption.NotSupportObjectException;
import com.beantools.util.StringUtil;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import static com.beantools.constants.SingleChar.*;
import static com.beantools.util.ObjectUtil.isNull;
import static com.beantools.util.StringUtil.isEmpty;
import static com.beantools.util.StringUtil.isNotBlank;

/**
 * 该类是一个继承AbstractFilters的类似于签名过滤器。拿到json字符串中的数据
 * 比如，{ "english": "WEDNESDAY",chinese": "星期三"}，获取冒号前面的字符串，
 * 并以key值的方式放在Map中，从而，实现排序的效果
 *
 * @author baoya
 * @version 1.1.0
 * @see BuilderFilters
 * @since 1.0
 */
public class SignFilters extends AbstractFilters<String, String> implements Serializable {

    private static final long serialVersionUID = 4143172165407822541L;

    private String jsonStr;

    public String getJsonStr(Object ts) {
        initFilter(ts);
        return jsonStr;
    }

    /**
     * 将这种格式的json字符串{ "english": "WEDNESDAY",chinese": "星期三"}
     * 转化为这种格式的字符串english=WEDNESDAY，并添加到set容器中
     * <pre>
     *     keyValues.add(english=WEDNESDAY)
     *     keyValues.add(chinese=星期三)
     * </pre>
     */
    private Set<String> keyValues;

    /**
     * 在创建无参构造器时，初始化container和keys的值，其都是链表形式
     */
    protected SignFilters() {
        keyValues = new HashSet<>();
    }

    /**
     * 获取连接的keyValues容器
     */
    public Set<String> getKeyValues(Object ts) {
        if (isNotBlank(getJsonStr(ts))) {
            String[] searchStrings = {LEFT_BRACE, RIGHT_BRACE, BLANK_OP, EN_SINGLE_QUOTES, EN_DOUBLE_QUOTATION};
            jsonStr = StringUtil.replaceAll(jsonStr, NULL_OP, searchStrings);
            jsonStr = jsonStr.replace(SIGN_COLON_OP, ASSIGN_OP);
            String[] jsons = jsonStr.split(SERIES_COMMA_OP);
            for (String json : jsons) {
                keyValues.add(json);
            }
        }
        return keyValues;
    }

    /**
     * 将json字符串中的数据封装成map形式，该方法的形参是json字符串。
     * 只能是这种格式的字符串{ "key1": "value1",key2": "value2"...}
     * <p>
     * <pre>
     *     map.put("english","WEDNESDAY")
     *     map.put("chinese","星期三")
     * </pre>
     * 同时，获取json结果集，比如：
     * <pre>
     *     keys.add("english")
     *     keys.add("chinese")
     * </pre>
     * <p>
     * 其返回的是Map集合，key是json的key值，value值是json的value值
     *
     * @param ts 泛型对象
     * @return Map<R, T>集合，如果ts为空，则返回空对象；如果没有
     * 得到过滤的数据，则返回长度为0的 Map<R, T>集合；否则，返回 Map<R, T>集合
     */
    @Override
    public void initFilter(Object ts) throws NotSupportObjectException, IllegalArgumentException {
        if (isNull(ts)) {
            throw new NotSupportObjectException("对象不能为空");
        }
        String jsonStr = null;
//        验证json是否符合格式
        if (ts instanceof String) {
            jsonStr = ((String) ts).trim();
            if (isEmpty(jsonStr) && !jsonStr.startsWith(LEFT_BRACE) && !jsonStr.endsWith(RIGHT_BRACE)) {
                throw new IllegalArgumentException("json不符合规则，比如{ \"key1\": \"value1\",key2\": \"value2\"...}");
            }
//            int countLeftBrace = StringUtil.countContains(jsonStr,LEFT_BRACE );
//            int countRightBrace = StringUtil.countContains(jsonStr,RIGHT_BRACE);
//            if (countLeftBrace != 1 && countRightBrace != 1) {
//                throw new IllegalArgumentException("左右大括号有且只有一个");
//            }
            this.jsonStr = jsonStr;
        }
    }

}
